package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

func main() {
	// 1. 原子增减操作（Add）
	demoAdd()

	// 2. 原子加载操作（Load）和存储操作（Store）
	demoLoadStore()

	// 3. 原子比较并交换操作（CompareAndSwap）
	demoCAS()
}

// 示例1：原子增减操作（Add）
func demoAdd() {
	var count int64 = 0
	var wg sync.WaitGroup

	// 启动100个goroutine同时对count进行加1操作
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go func() {
			defer wg.Done()
			// 原子地将count加1
			atomic.AddInt64(&count, 1)
		}()
	}

	wg.Wait()
	fmt.Printf("demoAdd: 最终计数 = %d（预期100）\n", count)
}

// 示例2：原子加载（Load）和存储（Store）
func demoLoadStore() {
	var value int32 = 0
	var wg sync.WaitGroup

	// 写入goroutine：更新value的值
	wg.Add(1)
	go func() {
		defer wg.Done()
		time.Sleep(100 * time.Millisecond) // 模拟计算耗时
		// 原子地存储新值
		atomic.StoreInt32(&value, 100)
		fmt.Println("demoLoadStore: 已更新value为100")
	}()

	// 读取goroutine：等待value更新后再读取
	wg.Add(1)
	go func() {
		defer wg.Done()
		// 循环等待，直到value被更新（原子加载）
		for atomic.LoadInt32(&value) == 0 {
			time.Sleep(10 * time.Millisecond)
		}
		fmt.Printf("demoLoadStore: 读取到value = %d\n", atomic.LoadInt32(&value))
	}()

	wg.Wait()
}

// 示例3：比较并交换（CompareAndSwap）
func demoCAS() {
	var value int32 = 10
	var wg sync.WaitGroup

	// 尝试将value从10修改为20
	wg.Add(1)
	go func() {
		defer wg.Done()
		// 原子比较并交换：如果当前值等于old，则更新为new
		swapped := atomic.CompareAndSwapInt32(&value, 10, 20)
		if swapped {
			fmt.Println("demoCAS: 成功将10修改为20")
		} else {
			fmt.Println("demoCAS: 修改失败（值已被其他goroutine修改）")
		}
	}()

	// 尝试将value从10修改为30（会失败，因为第一个goroutine已修改为20）
	wg.Add(1)
	go func() {
		defer wg.Done()
		time.Sleep(50 * time.Millisecond) // 确保先执行上面的goroutine
		swapped := atomic.CompareAndSwapInt32(&value, 10, 30)
		if swapped {
			fmt.Println("demoCAS: 成功将10修改为30")
		} else {
			fmt.Println("demoCAS: 修改失败（值已被其他goroutine修改）")
		}
	}()

	wg.Wait()
	fmt.Printf("demoCAS: 最终value = %d\n", value)
}
